/**
 * ConfigurableApplicationContext接口继承自ApplicationContext，为应用上下文提供了配置和管理的接口。
 * 它允许用户刷新上下文、关闭上下文、发布事件以及获取和设置环境配置。
 */
package com.test.context;

import com.test.aware.ApplicationContext;
import com.test.environment.ConfigurableEnvironment;
import com.test.event.ApplicationEvent;
import com.test.exception.BeansException;

public interface ConfigurableApplicationContext extends ApplicationContext{

    /**
     * 刷新上下文，重新加载配置并初始化所有 singleton beans。
     * 此方法在上下文配置更改后调用，以确保所有 bean 都反映新的配置。
     *
     * @throws BeansException 如果刷新过程中出现错误
     */
    void refresh() throws Exception;

    /**
     * 关闭上下文，销毁所有 singleton beans。
     * 此方法在应用关闭时调用，以确保所有资源都被正确释放。
     */
    void close();

    /**
     * 发布一个应用事件给所有 interested listeners。
     * 事件可以是任何应用相关的事件，例如一个新用户注册。
     *
     * @param event 要发布的应用事件
     */
    void publishEvent(ApplicationEvent event);

    /**
     * 获取当前上下文的环境配置。
     * 环境配置包含了应用运行时的外部配置，例如系统属性和环境变量。
     *
     * @return 当前上下文的环境配置
     */
    ConfigurableEnvironment getEnvironment();

    /**
     * 设置当前上下文的环境配置。
     * 此方法允许在上下文初始化之前配置其环境。
     *
     * @param environment 要设置的环境配置
     */
    void setEnvironment(ConfigurableEnvironment environment);
}

